/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server.negocio;

import cliente.comunicacion.ICliente;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.Horario;
import server.dominio.Medico;
import server.excepciones.MedicoInexistenteException;
import server.excepciones.MedicoNoExistenteException;
import server.excepciones.ProblemaConexionException;
import server.excepciones.UsuarioIncorrectoException;
import server.senders.Sender_lista;

/**
 *
 * @author tpaxle
 */
public class Controlador_Horario {
    private Controlador_Servidor C_servidor;
    private Fachada_Servidor fachada_basedatos;
    private DateFormat  formateadorfecha;
    private Notificador notificador;


    public Controlador_Horario(Controlador_Servidor C_servidor){
        this.C_servidor= C_servidor;
        fachada_basedatos= new Fachada_Servidor();
        formateadorfecha= new SimpleDateFormat("dd/MM/yyyy hh:mm");
        notificador= new Notificador(C_servidor);
    }

    public void peticionhorario(long idSesion, Object informacion) throws SQLException, MedicoNoExistenteException, UsuarioIncorrectoException, MedicoInexistenteException {
        String nif= (String)informacion;
        if(C_servidor.comprobarUsuario(1, idSesion)){
            Medico medico= fachada_basedatos.getMedico(nif);
            ArrayList<Object> listaHora= fachada_basedatos.getHorarios(medico);
            ICliente cliente= C_servidor.getCliente(idSesion);

            Sender_lista sender= new Sender_lista(cliente, listaHora, 2);
            sender.start();
        }
    }

    public void formatearhorario(long idSesion,Object informacion) throws UsuarioIncorrectoException, SQLException, ProblemaConexionException{
        Medico medico= (Medico)informacion;
        boolean error= true;
        if(C_servidor.comprobarUsuario(1, idSesion)){
             try {
                C_servidor.getProxyServidorb().refrescarCalendario(medico);
                error= false;

            } catch (RemoteException ex) {
                Logger.getLogger(Controlador_Horario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex){}
            catch (Exception ex) {
                Logger.getLogger(Controlador_Horario.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(error)
                throw new ProblemaConexionException("Los horarios no se han podido refrescar");
             
            fachada_basedatos.formatearhorario(medico);
            notificador.notificarhorarioborrado(medico.getUsuario().getNif());
        }
    }

    public void insertarDatos(long idSesion, Medico medico, Vector<Date> dias, Date horaDesde, Date horaHasta) throws UsuarioIncorrectoException, SQLException, ProblemaConexionException, MedicoInexistenteException{
        boolean error= true;
        if(C_servidor.comprobarUsuario(1, idSesion)){

            try {
                C_servidor.getProxyServidorb().insertarDatos(medico, dias, horaDesde, horaHasta);
                error= false;
            } catch (RemoteException ex) {
                Logger.getLogger(Controlador_Horario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex){
                Logger.getLogger(Controlador_Horario.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Error: debug: "+ ex.toString());
            }
            catch (Exception ex) {
                Logger.getLogger(Controlador_Horario.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(error)
                throw new ProblemaConexionException("problema exception");

            //A continuacion se adaptan los datos a lo que acepta la base de datos
            //A continuacion se adaptan los datos a lo que acepta la base de datos
            Calendar fechas= Calendar.getInstance();
            for(Date fecha: dias){
                //Para cada fecha se inserta los valores desde hasta
                fachada_basedatos.insertarhora(new Horario(medico,horaDesde,horaHasta,fecha, "Libre", null));
            }

            notificador.notificarhorarionuevo(medico.getUsuario().getNif());
        }
    }
}
